package com.quick.develop.flowable.domain.rule;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.quick.develop.flowable.domain.BaseDO;
import com.quick.develop.flowable.framework.enums.definition.BpmTaskAssignRuleTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

/**
 * @author junyuan.liu
 * @description: 
 * @date 2022/5/18 14:28
 */
@TableName(value = "BPM_PRO_RULE", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
public class BpmProcessRule extends BaseDO {

    private static final long serialVersionUID = 6049447800479286830L;
    /**
     * 空串，用于标识属于流程模型，而不属于流程定义
     */
    public static final String PROCESS_DEFINITION_ID_NULL = "";

    /**
     * 主键
     */
    @TableId(value="id",type = IdType.AUTO)
    private Long id;

    /**
     * 节点编码
     */
    private String nodeCode;
    /**
     * 节点名称
     */
    private String nodeName;
    /**
     * 是否多实例
     */
    private Boolean isMulti;

    /**
     * 模型ID
     */
    private String modelId;
    /**
     * 模型KEY
     */
    private String modelKey;


    /**
     * 定义ID
     */
    private String processDefinitionId;

    /**
     * 主键
     */
    @TableField("COMMENT_")
    private String comment;

    /**
     * 表单编码
     */
    private String formCode;
    /**
     * 表单名称
     */
    private String formType;
    /**
     * 退回节点编码
     */
    @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.IGNORED)
    private List<String> backNodeCode;
    /**
     * 退回节点名称
     */
    @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.IGNORED)
    private List<String> backNodeName;

    /**
     * 按钮权限
     * 必须开映射注解
     * 实体类上，需要加上注解 @TableName(autoResultMap = true)
     */
    @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.IGNORED)
    private List<String> btnEvents;

    private String defaultBtnEvent;

    /**
     *处理人指定类型 候选或者指定 或者预指定
     * {@link BpmTaskAssignRuleTypeEnum}
     */
    private Integer assigneeType;
    /**
     * 规则类型
     *
     * 枚举 {@link BpmTaskAssignRuleTypeEnum}
     */
    private Integer optionsType;

    /**
     * 负责人
     */
    private Integer optionsLeader;


    /**
     * 是否默认自己
     */
    private String isDefaultOwn;

    /**
     * 是否可修改
     */
    private String isModifiable;

    /**
     * 是否配置可选范围
     */
    private String isOptionalRange;

    /**
     * 可选控件
     */
    @TableField(value = "OPTIONAL_CONTROLS", typeHandler = JacksonTypeHandler.class)
    private Set<String> optionalControls;

    /**
     * 人员选择配置
     */
    private String personnelConfigure;


    /**
     * 角色选择配置
     */
    private String roleConfigure;


    /**
     * 部门选择配置
     */
    private String deptConfigure;



    /**
     * 人员可选值
     */
    @TableField(value = "OPTIONS_PERSONNEL", typeHandler = JacksonTypeHandler.class)
    private Set<String> optionsPersonnel;



    /**
     * 角色可选值
     */
    @TableField(value = "OPTIONS_ROLE", typeHandler = JacksonTypeHandler.class)
    private Set<String> optionsRole;


    /**
     * 部门可选值
     */
    @TableField(value = "OPTIONS_DEPT", typeHandler = JacksonTypeHandler.class)
    private Set<String> optionsDept;



    /**
     * 规则值数组，一般关联指定表的编号
     * 根据 type 不同，对应的值是不同的：
     *
     * 1. {@link BpmTaskAssignRuleTypeEnum#ROLE} 时：角色编号
     * 2. {@link BpmTaskAssignRuleTypeEnum#DEPT_MEMBER} 时：部门编号
     * 3. {@link BpmTaskAssignRuleTypeEnum#DEPT_LEADER} 时：部门编号
     * 4. {@link BpmTaskAssignRuleTypeEnum#USER} 时：用户编号
     * 5. {@link BpmTaskAssignRuleTypeEnum#USER_GROUP} 时：用户组编号
     */
    @TableField(value = "OPTIONS_", typeHandler = JacksonTypeHandler.class)
    private Set<String> options;

    /**
     * 特殊业务配置
     * 1: 分发业务
     */
    @TableField(value = "SPECIAL_NODE",typeHandler = JacksonTypeHandler.class)
    private Set<String> specialNodes;

}
